#ifndef SERIALPORT_H
#define SERIALPORT_H
#include <string>
#include <vector>
#include <functional>
#include <thread>
#include <mutex>
#include <atomic>
#include <chrono>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <dirent.h>
#include <algorithm>

class SerialPort {
public:
    // 串口配置结构体   串口打开失败: 无法打开串口设备: /dev/ttyTHS1 - Permission denied****
    struct Config {
        std::string device = "/dev/ttyTHS1";  // 默认设备 /dev/ttyTHS1
        int baudRate = 115200;                  // 波特率
        int dataBits = 8;                     // 数据位
        int stopBits = 1;                     // 停止位
        char parity = 'N';                    // 校验位 N-无校验 E-偶校验 O-奇校验
        int timeout = 1000;                   // 超时时间(ms)
        size_t bufferSize = 4096;      // 接收缓冲区大小
        std::string delimiter = "\n";   // 数据包分隔符
        bool usePacketMode = false;     // 是否使用数据包模式
    };

    // 数据接收回调函数类型
    using DataCallback = std::function<void(const std::vector<uint8_t>&)>;

    SerialPort();
    ~SerialPort();

    // 基本操作
    bool open(const Config& config);
    void close();
    bool isOpen() const;
    // 数据传输
    bool write(const std::vector<uint8_t>& data);
    bool write(const std::string& data);
    std::vector<uint8_t> read(size_t maxBytes = 1024);
    std::string readString(size_t maxBytes = 1024);
    // 异步读取
    void startAsyncRead(DataCallback callback);
    void stopAsyncRead();

    // 工具函数
    static std::vector<std::string> listAvailablePorts();
    std::string getLastError() const;

    // 校验
    uint8_t calculateChecksum(std::vector<uint8_t>& data);
    bool verifyChecksum(std::vector<uint8_t>& data, uint8_t expectedChecksum);
    bool writeWithChecksum(std::vector<uint8_t>& data);// 带校验和的写入

    // 将多个16位值转换为小端序字节数组
    std::vector<uint8_t> uint16ArrayToLittleEndian(const std::vector<uint16_t>& values);
private:
    int m_fd;                           // 文件描述符  串口的打开与关闭操作
    Config m_config;                    // 串口配置
    std::string m_lastError;            // 最后的错误信息
    
    // 异步读取相关 /dev/ttyTHS1 
    std::thread m_readThread;
    std::atomic<bool> m_stopReading;
    DataCallback m_dataCallback;
    mutable std::mutex m_mutex;

    std::vector<uint8_t> m_receiveBuffer;  // 接收缓冲区
    std::string m_delimiter = "\n";        // 数据分隔符
    bool m_useDelimiter = false;           // 是否使用分隔符模式

    // 内部方法
    bool configurePort();
    void readThreadFunction();//接收
    void setError(const std::string& error);
};

#endif // SERIALPORT_H
